#include "drv_servo.h"

/**************************************
函数名：drv_pwm_init
函数功能：pwm初始化
输入参数：无
输出参数：无
其它： 定时20ms中断一次
		分频=84；装载值=5000；
****************************************/
void drv_pwm_init(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//开启GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//开启TIM1时钟

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;//引脚为8、9、10、11
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource8,  GPIO_AF_TIM1);  // PA8 -> TIM1_CH1
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,  GPIO_AF_TIM1);  // PA9 -> TIM1_CH2
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_TIM1);  // PA10 -> TIM1_CH3
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_TIM1);  // PA11 -> TIM1_CH4
	
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分割，输入才用
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//选择计数方式为向上计数
	TIM_TimeBaseInitStruct.TIM_Period = 20000-1;//装载值(就是数多少次)
	TIM_TimeBaseInitStruct.TIM_Prescaler = 168-1;//预分频值
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);//用上面配置的参数初始化定时器1

	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//输出模式为PWM1
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性为高
	TIM_OCInitStruct.TIM_OutputState = ENABLE;//使能输出
	TIM_OCInitStruct.TIM_Pulse = 0;//比较初值


	TIM_OC1Init(TIM1, &TIM_OCInitStruct);  // 通道 1（PA8）
    TIM_OC2Init(TIM1, &TIM_OCInitStruct);  // 通道 2（PA9）
    TIM_OC3Init(TIM1, &TIM_OCInitStruct);  // 通道 3（PA10）
    TIM_OC4Init(TIM1, &TIM_OCInitStruct);  // 通道 4（PA11）

    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  // 通道 1 比较影子寄存器
    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  // 通道 2
    TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);  // 通道 3
    TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);  // 通道 4
    
	TIM_ARRPreloadConfig(TIM1, ENABLE);          // 自动重装载影子寄存器
	TIM_CtrlPWMOutputs(TIM1,ENABLE);//使能输出PWM输出
	TIM_Cmd(TIM1, ENABLE);//使能定时器 1
}

// angle: 0~180 度，对应 0.5ms~2.5ms 高电平
void sg90_set_angle(uint8_t angle, uint8_t channel)
{
    // 角度映射：0度对应500，180度对应2500，先算比例
    //uint16_t pulse = 500 + (angle * (2500 - 500) / 180);  
	uint16_t pulse = 1000 + (angle * (2000 - 1000) / 180);  // 1ms~2ms范围
    switch(channel)//正面是靠近蜂鸣器那一边
    {
        case 1:
            TIM_SetCompare1(TIM1, pulse);//左前
            break;
        case 2:
            TIM_SetCompare2(TIM1, pulse);//左后
            break;
        case 3:
            TIM_SetCompare3(TIM1, pulse);//右前
            break;
        case 4:
            TIM_SetCompare4(TIM1, pulse);//右后
            break;
        default:
            break;
    }
}


